#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 创建一个按钮，用户点击这个按钮，则关闭窗口
//    QPushButton* button = new QPushButton(this);
    // 设置坐标
//    button->move(200, 300);
//    button->setText("退出");
    // 关联信号
//    connect(button, &QPushButton::clicked, this, &Widget::close); // close是QWidget内置的一个槽函数

    // 自定义槽函数
    // 第一种方式——定义成员函数
//    connect(button, &QPushButton::clicked, this, &Widget::handlerClicked);
    // 第二种方式——使用ui文件(按照函数名寻找)
    // 自定义槽函数很关键，在实际开发中大部分情况都是要我们自定义槽函数的
    // 因为槽函数就是用户出发某个操作之后，我们要处理的业务逻辑

    // 自定义信号
    // 而自定义信号比较少见，在实际开发中，很少需要自定义信号的，因为信号对应着用户的某一个操作
    // 在图形化界面中，用户的操作是可以穷局的

    // 所谓的Qt信号，其实本质上也就是一个特殊的成员函数
    //程序员只需要写出函数的声明，并且告诉Qt，这是一个“信号”
    // 而这个函数的定义，是在Qt程序的编译过程中自动生成的(而且自动生成过程，程序员无法干预)
    // 而且作为信号函数，这个函数的返回值必须是void有没有参数都可以，也可以支持重载

    // 使用自定义信号
    // 先建立连接
//    connect(this, &Widget::mysignal, this, &Widget::handlerClicked);
    // 自定义信号不同于内置信号，必须手动发射信号
    // 使用emit关键字发送信号
//    emit mysignal();
    // 当然、发送信号的操作不一定非得在构造函数中，也可以在任意合适的地方


    // 其实信号函数和槽函数也是可以带参数的
    // 当信号函数带有参数的时候，与之对应的槽函数的参数必须和信号函数的参数一致
    // 这样一来，在发射信号的时候就可以就可以给信号函数传递实参，而对应的参数就可以被传递到对应的槽函数中
    connect(this, &Widget::mysignal, this, &Widget::handlerMysignal);




}

Widget::~Widget()
{
    delete ui;
}

void Widget::handlerClicked()
{
    // 按下按钮的时候，就修改一下窗口的标题
    this->setWindowTitle("按钮已经按下!!");

}

void Widget::handlerMysignal(const QString& str)
{
    this->setWindowTitle(str);
}


void Widget::on_pushButton_clicked()
{
    // 按下按钮的时候，就修改一下窗口的标题
//    this->setWindowTitle("按钮已经按下!!");
//    emit mysignal();
    // 而其实，在qt发展到Qt5的时候，emit其实啥也没做，所有的操作都在mysignal的定义中就已经做完了
    // 所以不写emit也是可以的
    emit mysignal("带参数的信号已经发送!");
}
